package com.chengqs.rapid.core.netty.processor.filter;

import com.chengqs.rapid.core.context.Context;
import com.chengqs.rapid.core.helper.ResponseHelper;

/**
 * <B>主类名称：</B>AbstractLinkedProcessorFilter<BR>
 * <B>概要说明：</B>抽象的带有链表形式的过滤器<BR>
 *
 * @author: chengqs
 * @create: 2025-03-15 01:52:33
 **/
public abstract class AbstractLinkedProcessorFilter<T> implements ProcessorFilter<Context> {

    // 做一个链表里面的一个元素，必须要有下一个元素的引用
    protected AbstractLinkedProcessorFilter<T> next = null;

    @Override
    public void fireNext(Context ctx, Object... args) throws Throwable {

        // 上下文生命周期：
        if (ctx.isTerminated()) {
            return;
        }

        if (ctx.isWritten()) {
            ResponseHelper.writeResponse(ctx);
        }

        if(next != null) {
            if(!next.check(ctx)) {
                next.fireNext(ctx, args);
            } else {
                next.transformEntry(ctx, args);
            }
        } else {
            // 没有下一个节点了，已经到了链表的最后一个节点
            ctx.terminated();
            return;
        }

    }

    @Override
    public void transformEntry(Context ctx, Object... args) throws Throwable {
        // 子类调用：这里就是真正执行下一个节点(元素)的操作
        entry(ctx, args);
    }

    public void setNext(AbstractLinkedProcessorFilter<T> next) {
        this.next = next;
    }

    public AbstractLinkedProcessorFilter<T> getNext() {
        return next;
    }
}
